package com.niit.musicserve.utils;

import com.niit.musicserve.entity.Admin;
import com.niit.musicserve.entity.Consumer;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUtil {
    
    // 使用安全的密钥生成方式
    private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS512);
    private long expiration = 86400; // 24小时
    
    /**
     * 生成用户token
     */
    public String generateToken(Consumer consumer) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("consumerId", consumer.getConsumerId());
        claims.put("consumerName", consumer.getConsumerName());
        claims.put("consumerEmail", consumer.getConsumerEmail());
        claims.put("type", "consumer");
        
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(consumer.getConsumerEmail())
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
                .signWith(secretKey) // 使用安全密钥
                .compact();
    }
    
    /**
     * 生成管理员token
     */
    public String generateToken(Admin admin) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("adminName", admin.getAdminName());
        claims.put("type", "admin");
        
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(admin.getAdminName())
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
                .signWith(secretKey) // 使用安全密钥
                .compact();
    }
    
    /**
     * 获取token中的信息
     */
    public Claims getClaimsFromToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(secretKey) // 使用安全密钥验证
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * 验证token是否有效
     */
    public boolean validateToken(String token) {
        try {
            Jwts.parserBuilder()
                    .setSigningKey(secretKey) // 使用安全密钥验证
                    .build()
                    .parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * 获取token中的使用者名称
     */
    public String getUsernameFromToken(String token) {
        try {
            Claims claims = getClaimsFromToken(token);
            return claims.getSubject();
        } catch (Exception e) {
            return null;
        }
    }
}
